package br.com.petsis.funcionalidades.consultarVales;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Funcionario;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.TipoVale;
import br.com.petsis.entity.Vale;
import br.com.petsis.vo.ConsultaValesVO;

@Name("consultarValesController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ConsultarValesController {
	
	private static final String QRY_VALES = "select v from Vale v where v.empresa.idEmpresa = :idEmpresa and v.flgAtivo = 'T'";
	private static final String QRY_FUNCIONARIOS = "select f from Funcionario f where f.empresa.idEmpresa = :idEmpresa and f.flgAtivo = 'T'";
	private static final String QRY_TIPOS_VALE = "select t from TipoVale t where t.empresa.idEmpresa = :idEmpresa and t.flgAtivo = 'T'";

	@In(create=true)
	private EntityManager entityManager;
	
	private List<Vale> listaVales;
	
	private List<SelectItem> listaFuncionarios;
	
	private List<SelectItem> listaTiposVale;
	
	private Float valorTotal;
	
	private ConsultaValesVO parametrosConsulta;
	
	@In(required=false)
    private Empresa empresaSessao;
	
	public void onLoad(){
		setValorTotal(null);
		setListaVales(null);
		setListaFuncionarios(null);
		setListaTiposVale(null);
	}
	
	public void pesquisar(){
		if(empresaSessao == null){
			return;
		}
		
		StringBuffer query = new StringBuffer(QRY_VALES);
		
		if(getParametrosConsulta().getIdFuncionario() != null){
			query.append(" and v.funcionario.idFuncionario = :idFuncionario");
		}
		
		if(getParametrosConsulta().getDataInicioVale() != null){
			query.append(" and v.dtaVale >= :dtaInicio");
		}
		
		if(getParametrosConsulta().getDataFimVale() != null){
			query.append(" and v.dtaVale <= :dtaFim");
		}
		
		if(getParametrosConsulta().getIdTipoVale() != null){
			query.append(" and v.tipoVale.idTipoVale = :idTipoVale");
		}
		
		query.append(" ORDER BY v.dtaVale DESC");
		
		Query qryResult = entityManager.createQuery(query.toString());
		
		qryResult.setParameter("idEmpresa", empresaSessao.getIdEmpresa());
		
		if(getParametrosConsulta().getIdFuncionario() != null){
			qryResult.setParameter("idFuncionario", getParametrosConsulta().getIdFuncionario());
		}
		
		if(getParametrosConsulta().getDataInicioVale() != null){
			qryResult.setParameter("dtaInicio", getParametrosConsulta().getDataInicioVale());
		}
		
		if(getParametrosConsulta().getDataFimVale() != null){
			qryResult.setParameter("dtaFim", getParametrosConsulta().getDataFimVale());
		}
		
		if(getParametrosConsulta().getIdTipoVale() != null){
			qryResult.setParameter("idTipoVale", getParametrosConsulta().getIdTipoVale());
		}
		
		listaVales = qryResult.getResultList();
		
		valorTotal = 0F;
		if(listaVales == null || listaVales.size() == 0){
			FacesMessages.instance().add(Severity.ERROR,"Nenhum registro encontrado.");
			
		}else{
			for(Vale p : listaVales){
				valorTotal = valorTotal + p.getVlrVale();
			}
			FacesMessages.instance().add(Severity.INFO,"Foram encontrados "+listaVales.size()+" registros.");
		}
	}

	public ConsultaValesVO getParametrosConsulta() {
		if (parametrosConsulta == null) {
			parametrosConsulta = new ConsultaValesVO();
		}
		return parametrosConsulta;
	}

	public void setParametrosConsulta(ConsultaValesVO parametrosConsulta) {
		this.parametrosConsulta = parametrosConsulta;
	}

	public Float getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Float valorTotal) {
		this.valorTotal = valorTotal;
	}

	public List<Vale> getListaVales() {
		if (listaVales == null) {
			listaVales = new ArrayList<Vale>();
		}
		return listaVales;
	}

	public void setListaVales(List<Vale> listaVales) {
		this.listaVales = listaVales;
	}

	public List<SelectItem> getListaFuncionarios() {
		if (listaFuncionarios == null) {
			listaFuncionarios = new ArrayList<SelectItem>();
			listaFuncionarios.add(new SelectItem(null,"Todos"));
			if(empresaSessao != null){
				List<Funcionario> lista = entityManager.createQuery(QRY_FUNCIONARIOS)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(Funcionario f : lista){
					listaFuncionarios.add(new SelectItem(f.getIdFuncionario(),f.getDscNome()));
				}
			}
		}
		return listaFuncionarios;
	}

	public void setListaFuncionarios(List<SelectItem> listaFuncionarios) {
		this.listaFuncionarios = listaFuncionarios;
	}

	public List<SelectItem> getListaTiposVale() {
		if (listaTiposVale == null) {
			listaTiposVale = new ArrayList<SelectItem>();
			listaTiposVale.add(new SelectItem(null,"Todos"));
			if(empresaSessao != null){
				List<TipoVale> lista = entityManager.createQuery(QRY_TIPOS_VALE)
					.setParameter("idEmpresa", empresaSessao.getIdEmpresa())
					.getResultList();
				for(TipoVale t : lista){
					listaTiposVale.add(new SelectItem(t.getIdTipoVale(),t.getDscTipoVale()));
				}
			}
		}
		return listaTiposVale;
	}

	public void setListaTiposVale(List<SelectItem> listaTiposVale) {
		this.listaTiposVale = listaTiposVale;
	}
	
}
